package org.shj.pattern.visitor

import scala.collection.mutable.ArrayBuffer

/**
 * 访问者模式：
 * 意图： 主要将数据结构与数据操作分离
 * 主要解决： 稳定的数据结构和易变的操作耦合的问题
 * 何时使用： 需要对一个对象结构中的对象进行很多不同的并且不相关的操作，而需要避免这些操作“污染”这些对象的类。
 * 优点： 1. 符合单一职责原则，  2. 优秀的扩展性（对数据操作而言）  3. 灵活性
 * 缺点： 1. 具体元素对访问者公布细节，违反了迪米特原则  2. 具体元素变更比较困难。  3. 依赖了具体类，没有依赖抽象
 */
object VisitorMain {
  def main(args: Array[String]): Unit = {
    val objStruc = new ObjectStructure()
    val man = new Man
    val woman = new Woman
    objStruc.attach(man)
    objStruc.attach(woman)
    
    val success = new Success
    objStruc.display(success)
    
    val fail = new Fail
    objStruc.display(fail)
  }
}

class ObjectStructure{
  private val elements = ArrayBuffer[Person]()
  
  def attach(e: Person){
    elements += e
  }
  
  def detach(e: Person){
    elements -= e
  }
  
  def display(act: Action){
    elements.foreach(_.accept(act))
  }
}